package com.zy.Lambda;

import org.junit.Test;

import java.util.function.Function;

public class UseFunction
{
    /*
    Function：函数型接口
        抽象方法：Type1 apply(Type2 t)：接受一个Type2类型的参数t，返回一个Type1类型的值
        默认方法：compose(Function before)：
            先执行compose方法参数中before接口的apply()方法，再将返回结果传递给调用compose的函数中的apply()方法
        默认方法：andThen(Function after)：
            先执行andThen函数的apply()方法，再将值传递给andThen方法参数中的after的apply()方法，和compose方法执行顺序刚好相反
        静态方法：identity()
            获取一个返回结果和传入参数一致的Function实例，即函数返回结果与传入参数一致
    * */
    @Test
    public void test1()
    {
        Function<Integer,Integer> function=a->a*a;
        int result=function.apply(3);
        System.out.println(result);
        //打印结果：9,计算3*3
    }

    @Test
    public void test2()
    {
        Function<Integer,Integer> function1=a->a*a;
        Function<Integer,Integer> function2=a->2*a;
        Integer apply = function1.compose(function2).apply(3);
        System.out.println("这是先执行function2，再执行function1的结果："+apply);
        //打印结果为：先执行function2，再执行function1的结果为：36
    }

    @Test
    public void test3()
    {
        Function<Integer,Integer> function1=a->a*a;
        Function<Integer,Integer> function2=a->2*a;
        Integer apply = function1.andThen(function2).apply(3);
        System.out.println("这是先执行function1，再执行function2的结果："+apply);
        //打印结果为：这是先执行function2，再执行function1的结果：36
    }
}
